/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.ui;

import edu.ucue.ptc.gco.mdl.Usuario;
import edu.ucue.ptc.gco.ngc.UsuarioManagerLocal;
import edu.ucue.ptc.gco.util.AtributoInvalidoException;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Marcelo
 */
@Named(value = "usuarioAction")
@SessionScoped
public class UsuarioAction implements Serializable {

    private Usuario usuario;
    private boolean modoModificar;
    @Inject
    private UsuarioManagerLocal usuarioManager;
    private List<Usuario> listaUsuarios;

    @PostConstruct
    public void init() {
        usuario = new Usuario();
        cargarLista();
    }

    public void cargarLista() {
        listaUsuarios = usuarioManager.listarUsuario();
    }

    public static UsuarioAction getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{usuarioAction}", UsuarioAction.class);
        return (UsuarioAction) ex.getValue(context);
    }

    public UsuarioAction() {
    }

    public String guardar() {
        try {
            if (!modoModificar) {
                usuarioManager.crearUsuario(usuario);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Guardado"));
                cargarLista();
            } else {
                usuarioManager.actualizarUsuario(usuario);
            }
            RequestContext.getCurrentInstance().update("tablaU");
            return "listausuarios";
        } catch (AtributoInvalidoException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, ex.getMessage()));
            Logger.getLogger(UsuarioAction.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "";
    }

    public String modificar(Usuario usuarioMod) {
        modoModificar = true;
        usuario = usuarioMod;
        return "usuario";
    }
    
    public String cancel() {
        return "index";
    }

    public String eliminar(Usuario usuarioElim) {
        try {
            usuarioManager.eliminarUsuario(usuarioElim);
            listaUsuarios.remove(usuarioElim);
            RequestContext.getCurrentInstance().update("tablaU");            
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Error al eliminar"));
            Logger.getLogger(UsuarioAction.class.getName()).log(Level.SEVERE, null, ex);
        }        
        return "listausuarios";
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public boolean isModoModificar() {
        return modoModificar;
    }

    public void setModoModificar(boolean modoModificar) {
        this.modoModificar = modoModificar;
    }

    public List<Usuario> getListaUsuarios() {
        return listaUsuarios;
    }

    public void setListaUsuarios(List<Usuario> listaUsuarios) {
        this.listaUsuarios = listaUsuarios;
    }
}
